First install the ggplot2 package and load it
You can also check your working directory and set it to a different location if needed
In an R notebook, your working directory is automatically the location you save this document to
You’ll have to reset the working directory for each chunk if it is different than where you saved, or you can change the overall working directory in a “setup chunk”
### install.packages("ggplot2")
library(ggplot2)
head(gapminder)
library(gapminder)
## find working directory
getwd()
[1] "/Users/alouyakis/Dropbox/sc_workshop_20190111"
## to change working directory (remove hash infront of code - I use a hash to block code from running if I don't need it)
#setwd("./data/")
Make plots with ggplot!
## basic scatter plot
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point()

## add some color and make it a line graph
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
by = country, color = continent)) +
geom_line()

## answer to socrative question
ggplot(data = gapminder, aes(x = year, y = lifeExp)) + geom_point()

## start adding some layers
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
by = country)) +
geom_line(aes(color = continent)) +
geom_point(aes(color = "blue"))

Make more plots in ggplot!
## back to scatter (no line)
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
color = continent)) +
geom_point()

## change scale
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
color = continent)) +
geom_point(alpha = 0.5) +
scale_x_log10()

## add regression line
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
color = continent)) +
geom_point(alpha = 0.5, aes(shape = continent), show.legend = FALSE) +
scale_x_log10() +
geom_smooth(method = "lm", size = 1.5)

Clean up your plot and save it (this is where you may find yourself in a rabbit hole for many hours)
## clean up for publication
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp,
color = continent)) +
geom_point(alpha = 0.5, size = 2, aes(shape = continent)) +
scale_x_log10() +
geom_smooth(method = "lm") +
scale_y_continuous(limits = c(0,100), breaks = seq(0,100, by = 10)) +
theme_bw() +
ggtitle("Effects of per-capita GDP on Life Expectancy") +
xlab("GDP per Capita ($)") +
ylab("Life Expectancy (yrs)") +
ggsave(file = "life_expectancy.png", width = 20, height = 20, units = "cm")
ggsave(file = "life_expectancy.pdf", width = 20, height = 20, units = "cm")

##socrative
ggplot(data = gapminder, aes(x = gdpPercap, y = lifeExp)) + geom_point()
ggsave(file = "life_expectancy.pdf")
Saving 7.29 x 4.51 in image

ggplot(data = gapminder, aes(x = year, y = lifeExp)) + geom_point()
ggsave(file = "life_expectancy.pdf")
Saving 7.29 x 4.51 in image

Just for fun, let’s make it a box plot
## boxplot
plot <- ggplot(data = gapminder, aes(x = continent, y = lifeExp)) +
geom_boxplot()
##print plot
plot

##add to plot and print out
plot + geom_point(alpha = 0.5, color = "tomato")

plot + geom_jitter(alpha = 0.5, color = "tomato")

##add to plot and make each an object
plot_tomato <- plot + geom_point(alpha = 0.5, color = "tomato")
plot_jitter <- plot + geom_jitter(alpha = 0.5, color = "tomato")
##print out your new plot objects
plot_tomato

plot_jitter

Just for fun and to up your R-game, try making your plots interactive!
When in an rnotebook, you can render interative plots to html and send to all your friends!
## To reach your A-game, make your plot interactive!
install.packages("plotly")
Error in install.packages : Updating loaded packages
library(plotly)
ggplotly(plot_jitter)
## now scroll over the points on your plot and you'll see info about each one
LS0tCnRpdGxlOiAiZ2dwbG90MiBpbnRybyIKYXV0aG9yOiBBcnRlbWlzIExvdXlha2lzCmVtYWlsOiBhcnRlbWlzLmxvdXlha2lzQHVjb25uLmVkdQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZGF0ZTogMjAxOS4wMS4xMQotLS0KCiMjIyMgRmlyc3QgaW5zdGFsbCB0aGUgZ2dwbG90MiBwYWNrYWdlIGFuZCBsb2FkIGl0CiMjIyMgWW91IGNhbiBhbHNvIGNoZWNrIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgYW5kIHNldCBpdCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBpZiBuZWVkZWQKIyMjIyBJbiBhbiBSIG5vdGVib29rLCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGF1dG9tYXRpY2FsbHkgdGhlIGxvY2F0aW9uIHlvdSBzYXZlIHRoaXMgZG9jdW1lbnQgdG8KIyMjIyBZb3UnbGwgaGF2ZSB0byByZXNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIGVhY2ggY2h1bmsgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gd2hlcmUgeW91IHNhdmVkLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgb3ZlcmFsbCB3b3JraW5nIGRpcmVjdG9yeSBpbiBhICJzZXR1cCBjaHVuayIKYGBge3J9CiMjIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKbGlicmFyeShnZ3Bsb3QyKQpoZWFkKGdhcG1pbmRlcikKbGlicmFyeShnYXBtaW5kZXIpCiMjIGZpbmQgd29ya2luZyBkaXJlY3RvcnkKZ2V0d2QoKQojIyB0byBjaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgKHJlbW92ZSBoYXNoIGluZnJvbnQgb2YgY29kZSAtIEkgdXNlIGEgaGFzaCB0byBibG9jayBjb2RlIGZyb20gcnVubmluZyBpZiBJIGRvbid0IG5lZWQgaXQpCiNzZXR3ZCgiLi9kYXRhLyIpCmBgYAoKIyMjIyBNYWtlIHBsb3RzIHdpdGggZ2dwbG90ISAKYGBge3J9CiMjIGJhc2ljIHNjYXR0ZXIgcGxvdApnZ3Bsb3QoZGF0YSA9IGdhcG1pbmRlciwgYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwKSkgKwogIGdlb21fcG9pbnQoKQoKIyMgYWRkIHNvbWUgY29sb3IgYW5kIG1ha2UgaXQgYSBsaW5lIGdyYXBoCmdncGxvdChkYXRhID0gZ2FwbWluZGVyLCBhZXMoeCA9IGdkcFBlcmNhcCwgeSA9IGxpZmVFeHAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gY291bnRyeSwgY29sb3IgPSBjb250aW5lbnQpKSArCiAgZ2VvbV9saW5lKCkgCgojIyBhbnN3ZXIgdG8gc29jcmF0aXZlIHF1ZXN0aW9uCmdncGxvdChkYXRhID0gZ2FwbWluZGVyLCBhZXMoeCA9IHllYXIsIHkgPSBsaWZlRXhwKSkgKyBnZW9tX3BvaW50KCkKCiMjIHN0YXJ0IGFkZGluZyBzb21lIGxheWVycwpnZ3Bsb3QoZGF0YSA9IGdhcG1pbmRlciwgYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGNvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGNvbnRpbmVudCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibHVlIikpCmBgYAoKIyMjIyBNYWtlIG1vcmUgcGxvdHMgaW4gZ2dwbG90IQpgYGB7cn0KIyMgYmFjayB0byBzY2F0dGVyIChubyBsaW5lKQpnZ3Bsb3QoZGF0YSA9IGdhcG1pbmRlciwgYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbnRpbmVudCkpICsKICBnZW9tX3BvaW50KCkKCiMjIGNoYW5nZSBzY2FsZQpnZ3Bsb3QoZGF0YSA9IGdhcG1pbmRlciwgYWVzKHggPSBnZHBQZXJjYXAsIHkgPSBsaWZlRXhwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbnRpbmVudCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgc2NhbGVfeF9sb2cxMCgpCgojIyBhZGQgcmVncmVzc2lvbiBsaW5lCmdncGxvdChkYXRhID0gZ2FwbWluZGVyLCBhZXMoeCA9IGdkcFBlcmNhcCwgeSA9IGxpZmVFeHAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29udGluZW50KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGFlcyhzaGFwZSA9IGNvbnRpbmVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNpemUgPSAxLjUpCmBgYAoKIyMjIyBDbGVhbiB1cCB5b3VyIHBsb3QgYW5kIHNhdmUgaXQgKHRoaXMgaXMgd2hlcmUgeW91IG1heSBmaW5kIHlvdXJzZWxmIGluIGEgcmFiYml0IGhvbGUgZm9yIG1hbnkgaG91cnMpCmBgYHtyfQojIyBjbGVhbiB1cCBmb3IgcHVibGljYXRpb24KZ2dwbG90KGRhdGEgPSBnYXBtaW5kZXIsIGFlcyh4ID0gZ2RwUGVyY2FwLCB5ID0gbGlmZUV4cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb250aW5lbnQpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSwgc2l6ZSA9IDIsIGFlcyhzaGFwZSA9IGNvbnRpbmVudCkpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwMCksIGJyZWFrcyA9IHNlcSgwLDEwMCwgYnkgPSAxMCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJFZmZlY3RzIG9mIHBlci1jYXBpdGEgR0RQIG9uIExpZmUgRXhwZWN0YW5jeSIpICsKICB4bGFiKCJHRFAgcGVyIENhcGl0YSAoJCkiKSArCiAgeWxhYigiTGlmZSBFeHBlY3RhbmN5ICh5cnMpIikgKwpnZ3NhdmUoZmlsZSA9ICJsaWZlX2V4cGVjdGFuY3kucG5nIiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGUgPSAibGlmZV9leHBlY3RhbmN5LnBkZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDIwLCB1bml0cyA9ICJjbSIpCmBgYAoKYGBge3J9CiMjc29jcmF0aXZlCmdncGxvdChkYXRhID0gZ2FwbWluZGVyLCBhZXMoeCA9IGdkcFBlcmNhcCwgeSA9IGxpZmVFeHApKSArIGdlb21fcG9pbnQoKQpnZ3NhdmUoZmlsZSA9ICJsaWZlX2V4cGVjdGFuY3kucGRmIikKZ2dwbG90KGRhdGEgPSBnYXBtaW5kZXIsIGFlcyh4ID0geWVhciwgeSA9IGxpZmVFeHApKSArIGdlb21fcG9pbnQoKQpnZ3NhdmUoZmlsZSA9ICJsaWZlX2V4cGVjdGFuY3kucGRmIikKYGBgCgojIyMjIEp1c3QgZm9yIGZ1biwgbGV0J3MgbWFrZSBpdCBhIGJveCBwbG90CmBgYHtyfQojIyBib3hwbG90CnBsb3QgPC0gZ2dwbG90KGRhdGEgPSBnYXBtaW5kZXIsIGFlcyh4ID0gY29udGluZW50LCB5ID0gbGlmZUV4cCkpICsKICBnZW9tX2JveHBsb3QoKQoKIyNwcmludCBwbG90CnBsb3QKCiMjYWRkIHRvIHBsb3QgYW5kIHByaW50IG91dCAKcGxvdCArIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbG9yID0gInRvbWF0byIpCnBsb3QgKyBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSwgY29sb3IgPSAidG9tYXRvIikKCiMjYWRkIHRvIHBsb3QgYW5kIG1ha2UgZWFjaCBhbiBvYmplY3QKcGxvdF90b21hdG8gPC0gcGxvdCArIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbG9yID0gInRvbWF0byIpCnBsb3Rfaml0dGVyIDwtIHBsb3QgKyBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSwgY29sb3IgPSAidG9tYXRvIikKCiMjcHJpbnQgb3V0IHlvdXIgbmV3IHBsb3Qgb2JqZWN0cwpwbG90X3RvbWF0bwpwbG90X2ppdHRlcgpgYGAKCiMjIyMgSnVzdCBmb3IgZnVuIGFuZCB0byB1cCB5b3VyIFItZ2FtZSwgdHJ5IG1ha2luZyB5b3VyIHBsb3RzIGludGVyYWN0aXZlISAKIyMjIyBXaGVuIGluIGFuIHJub3RlYm9vaywgeW91IGNhbiByZW5kZXIgaW50ZXJhdGl2ZSBwbG90cyB0byBodG1sIGFuZCBzZW5kIHRvIGFsbCB5b3VyIGZyaWVuZHMhCmBgYHtyfQojIyBUbyByZWFjaCB5b3VyIEEtZ2FtZSwgbWFrZSB5b3VyIHBsb3QgaW50ZXJhY3RpdmUhCmluc3RhbGwucGFja2FnZXMoInBsb3RseSIpCmxpYnJhcnkocGxvdGx5KQpnZ3Bsb3RseShwbG90X2ppdHRlcikKIyMgbm93IHNjcm9sbCBvdmVyIHRoZSBwb2ludHMgb24geW91ciBwbG90IGFuZCB5b3UnbGwgc2VlIGluZm8gYWJvdXQgZWFjaCBvbmUKYGBgCgo=